 /* eslint-disable no-async-promise-executor */
 const model = require("../models/model")
 const Files = model.files.Files // 获取模型
 const path = require('path')
 const fs = require('fs')
 const dirnameImage = path.join(__dirname, '../../server-files/images') // 存放文件的目录

 require('dotenv').config()
 const { PRO_API, DEV_API } = process.env
 
 // 判断文件目录是否存在 不存在则创建文件夹
 function access(catalog) {
   return new Promise((resolve) => {
     // 目录是否存在
     fs.access(catalog, async(err) => {
       // 文件和目录不存在的情况下 创建文件目录再执行
       if (err != null && err.code == "ENOENT") {
         console.log("目录不存在")
         fs.mkdir(catalog, async(err) => {
           if (err) {
             console.log('创建目录失败')
             resolve(false)
           } else {
             resolve(true)
           }
         })
       } else {
         resolve(true)
       }
     })
   })
   
 }
 
 // 上传图片到本地服务器
 exports.image = async(ctx) => {
  // 获取上传单个文件（2）
  const file = ctx.request.files.file // 获取上传文件
  if (!file) {
   ctx.fail('请上传文件')
   return
 }
  const fileType = file.name.substring(file.name.lastIndexOf('.') + 1) // 获取后缀格式
  const typeName = file.type.substring(0, file.type.lastIndexOf('/')) // 获取文件格式 用于判断
  if (typeName != 'image') {
    ctx.fail('文件格式错误，只能上传图片')
    return
  }
  function imagesUpload() {
    return new Promise(async(resolve) => {
      const isAccess = await access(dirnameImage)
      if (isAccess) { // 有目录
        const add_file = await Files.create({ 
          name: file.name,
          size: file.size,
          type: fileType
        })
        if (add_file) {
          const reader = fs.createReadStream(file.path)
          let filePath = dirnameImage + `/${add_file.id}.${fileType}`
          // 创建可写流
          const upStream = fs.createWriteStream(filePath)
          // 可读流通过管道写入可写流
          reader.pipe(upStream)

          reader.on('error', (err) => {
             // 处理可读流错误
             resolve(-1)
           });
          reader.on('close', async() => {
            // 可读流关闭时的处理
            // 获取地址
            const url_res = await getFile(add_file.id)
            if (url_res) {
              resolve({
                id: add_file.id,
                url: url_res
              })
            }
          })
          // 重命名
         //  fs.rename(filePath, dirnameImage + `/${add_file.id}.${fileType}`, async(err) => {
         //    if (err) {
         //     console.log('重命名失败')
         //      resolve(-1)
         //    } else {
         //      // 获取地址
         //      console.log('获取地址')
         //      const url_res = await getFile(add_file.id)
         //      if (url_res) {
         //        resolve({
         //          id: add_file.id,
         //          url: url_res
         //        })
         //      }
         //    }
         //  })
        }
      } else {
        resolve(-1)
      }
    })
  }
  // 返回信息
  const res = await imagesUpload()
  if (res != -1) {
    ctx.success({id: res.id, name: file.name, url: res.url}, '上传成功')
  } else {
    ctx.fail('未知错误', -1)
  }
}
 
 // 上传图片到七牛云
 exports.qiniuImage = async(ctx) => {
  const { uploadQiniu } = require('../util')
  const file = ctx.request.files.file // 获取上传文件
  if (!file) {
    ctx.fail('未上传图片')
    return
  }
  if (file.size > (1024 * 1024  * 5)) { // 限制大小（防止七牛云空间被恶意占用空间）
    ctx.fail('最大只能上传5mb文件')
    return false
  }
  const ext = file.name.split('.').pop() // 获取文件后缀扩展格式
  const fileType = file.type.split('/')[0] // 获取文件格式（用于判断）
  if (fileType != 'image') {
    ctx.fail('文件格式错误，只能上传图片')
    return
  }

  // 总方法
  function allFn() {
    return new Promise(async(resolve) => {
      const add_file = await Files.create({ 
        name: file.name,
        size: file.size,
        type: ext
      })
      if (add_file) { // 数据库创建信息成功
        // 创建文件可读流
        const reader = fs.createReadStream(file.path)
        // 命名文件以及拓展名
        const fileUrl = `${add_file.id}.${ext}`
        // 使用封装好的七牛云上传方法
        await uploadQiniu(reader, fileUrl)
        resolve({
          id: add_file.id,
          name: file.name,
          url: `http://files.jiangtao.ltd/${fileUrl}`
        })
        // if (res === -1) { // 如果上传失败了就再删除数据库的信息
        //   Files.destroy({ where : { id: add_file.id }}).then(() => {
        //     resolve(-1)
        //   })
        // } else { // 上传成功了就把文件信息返回
        //   resolve({
        //     id: add_file.id,
        //     name: file.name,
        //     url: res
        //   })
        // }
      }
    })
  }
  const res = await allFn()
  if (res !== -1) {
    ctx.success(res, '上传成功')
  } else {
    ctx.success('上传失败')
  }
}
 